package com.example.demo.mqserver.core;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 张
 * Date: 2024-07-10
 * Time: 19:30
 */


import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jms.JmsProperties;
import org.springframework.stereotype.Controller;

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

/**
 * 表示一个消息
 *
 * 一个message包含两个部分:
 * 1.属性部分:BasicProperties
 * 2.正文部分byte[]  (正文是支持二进制数据的)
 *
 * 此处的Message 对象,是需要能够在网络上传输,并且也需要能写入文件中的
 * 此时就需要对message进行序列化和反序列化
 * 此处使用标准库自带的 序列化 和 反序列化 操作
 */
@Data
public class Message implements Serializable {
    private BasicProperties basicProperties = new BasicProperties();
    private byte[] body;  //这个getBody传出去,由于是一个数组直接打印是打印的地址(SE)
    //辅助属性
    //message 后续会存储到文件中(如果选择持久化)
    //一个文件中会有存储很多的消息
    //此时就使用两个偏移量来表示 [offsetBag,offsetEnd)
    //这两哥们不需要序列化的文件中,此时消息一旦被写入文件之后,所在位置就固定住了,不需要单独存储 (transient)针对序列化场景
    private transient long offsetBeg = 0;//表示数据的开头距离文件的开头的位置偏移(字节)
    private transient long offsetEnd = 0;//表示数据的结尾距离文件的开头的位置偏移(字节)
    //使用这个属性表示消息在文件中是否是有效消息(针对文件中的消息逻辑删除,如果删除,就使用逻辑删除)
    //0x1表示有效,0x0表示无效(为了在文件上表示)
    private byte isValid = 0x1;

    //创建一个工程方法,让工厂创建一下message对象的过程
    //这个方法中创建的message对象,会自动生成唯一的MessageId
    public static Message createMessageWithId(String routingKey,BasicProperties basicProperties,byte[] body) {
        Message message = new Message();
        if(basicProperties != null) {
            message.setBasicProperties(basicProperties);
        }
        message.setMessageId("M-" + UUID.randomUUID());
        //万一routingKey 和 basicProperties里面的routingKey冲突了以外面的为主
        message.basicProperties.setRoutingKey(routingKey);
        message.body = body;
        return message;
    }



    public String getMessageId() {
        return basicProperties.getMessageId();
    }

    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    public int getDeliverMode() {
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int mode) {
        basicProperties.setDeliverMode(mode);
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                ", offsetBeg=" + offsetBeg +
                ", offsetEnd=" + offsetEnd +
                ", isValid=" + isValid +
                '}';
    }

    public String getRoutingKey () {
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey (String routingKey) {
        basicProperties.setRoutingKey(routingKey);
    }
}